Unity[MonoBehavior]SetActive和enabled的使用与MonoBehavior的关系
问题发现
当GameObject
勾选,Mesh Renderer
不勾选的情况下,运行游戏,可在Start()
中从自身获取到Materials
中元素。之前以为无法通过脚本获取enabled=false
的组件内容,重新看了一下生命周期的相关内容,记录一下。
MonoBehaviour的生命周期
周期图不在此复制了,网上有很多。Monobehaviour
作为Unity的特殊组件,一个脚本继承的时候会自动调用很多方法,方法称为“事件函数”。
Awake()
- 加载场景时会调用Awake
- 初始化使用
Object.Instantiate
创建的 GameObject时会调用Awake - 在脚本实例的生存期内,只会调用一次,所以用于初始化,脚本的生存期持续到包含它的场景被卸载为止,如果重新加载场景,也会重新调用Awake
- Unity 调用每个 GameObject 的 Awake 的顺序是不确定的,用 Awake 在脚本之间设置引用,并使用 /Start/(在所有 Awake 调用完成后调用)来回传递任何信息
- 对于未激活的 GameObject,调用 GameObject.SetActive (GameObject为On)可以将其激活。
Start()
- 唤醒后执行一帧,与 Awake 不同的是,它在一帧之后执行。
- 在脚本生命周期内仅调用一次
- GameObject 和 MonoBehaviour 都在 ON 状态下运行(活动)
OnEnable()
与 Awake 和 Start 一样,它用于初始化。但是,与 Awake 和 Start 不同的是,它被多次调用是一个很大的功能。 - 在 GameObject 和 MonoBehaviour 都打开的情况下运行
- 唤醒后运行(Start前)
- 运行多次,在对象变为启用和激活状态时调用。
OnDisable()
OnEnable 的反向。关闭时调用。 - 当 GameObject 或 MonoBehaviour 关闭时工作
- 即使组件被移除也能工作
Update()
- 运行每一帧
- 在 GameObject 和 MonoBehaviour 都打开的情况下运行
OnDestory()
- 场景或游戏结束时,发生 OnDestroy
- 删除 GameObject 或 MonoBehaviour执行
- 如果您过去没有运行 Awake,则不起作用。如果 GameObject 仍处于非活动状态,则 OnDestroy 将不起作用。
选择SetActive or enabled
Awake
、Start
、OnEnable
、Update
执行的条件是GameObject或Component处于活动状态,活动状态如下图所示
GameObject(SetActive)和Component(enabled)的6种切换模式
GameObject
[SetActive(false)]Component
[enabled=false]
执行事件函数:无
2. GameObject
[SetActive(true)] Component
[enabled=false]
执行事件函数:Awake()
3. GameObject
[SetActive(false)] Component
[enabled=true]
执行事件函数:无
4. GameObject
[SetActive(true)] Component
[enabled=true]
执行事件函数:Awake()、OnEnable()、Start()、Update()
除非
GameObject
被打开,否则什么都不会起作用
- 先
GameObject
[SetActive(true)]Component
[enabled=false],再GameObject
[SetActive(true)]Component
[enabled=true]
状态发生变化时执行事件函数:OnEnable()、Start()、Update(),未执行Awake()
6. 保持Component
状态不变,使GameObject
默认开启,然后关闭再打开
状态发生变化时执行事件函数:OnEnable()、Update(),未执行Awake()、Start()
Awake()、Start()每个
GameObject
只能调用一次
总结
Component
的活动状态(enable)ON / OFF影响的是特定的事件函数,如果为 OFF 仅为不自动执行这些周期事件函数,所以不会影响到取其中的字段内容。
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!